package fun

import (
	"time"
)

const ORIGIN_TIME = "2006-01-02 15:04:05" //go原始时间

// @title: Rfc3339格式时间转为正常时间
// @param: Rfc3339时间字符(string)
// @return: 时间字符串(string)
// @description: 如 2018-01-14T21:45:54+08:00 转为 2018-01-14 21:45:54
// @date: 2024/6/11 22:32
func Rfc3339ToDatetime(str string) string {
	tt, _ := time.Parse(time.RFC3339, str)
	return tt.Format(ORIGIN_TIME)
}

// @title: 标准时间转为时间戳
// @param: 标准时间(string)
// @return: 时间戳（秒）(int64)
// @description: 如 2018-01-14 21:45:54 转为 1515937554
// @date: 2024/6/11 22:32
func DatetimeToTimestamp(str string) int64 {
	loc, _ := time.LoadLocation("Local") //获取时区
	tmp, _ := time.ParseInLocation(ORIGIN_TIME, str, loc)
	timestamp := tmp.Unix() //转化为时间戳 类型是int64
	return timestamp
}

// @title: 时间戳转为标准时间
// @param: 时间戳(int64)
// @return: 标准时间(string)
// @description: 如 1515937554 转为 2018-01-14 21:45:54
// @date: 2024/6/11 22:32
func TimestampToDatetime(timestamp int64) string {
	return time.Unix(timestamp, 0).Format(ORIGIN_TIME)
}

// @title: 获取当前标准时间
// @param:
// @return: 标准时间(string)
// @description: 时间格式：2021-12-30 23:14:07
// @date: 2024/6/11 22:32
func CurrentDateTime() string {
	return time.Now().Format(ORIGIN_TIME)
}

// @title: 获取当前时间戳（秒）
// @param:
// @return: 时间戳(int64)
// @description:
// @date: 2024/6/11 22:32
func TimeStampSecond() int64 {
	return time.Now().Unix()
}

// @title: 获取时间戳（毫秒）
// @param:
// @return: 时间戳(int64)
// @description:
// @date: 2024/6/11 22:32
func Millisecond() int64 {
	return time.Now().UnixNano() / 1e6
}

// @title: 一个字符串时间与当前时间的时间差
// @param: 字符串时间(string) 如：2022-05-22 23:59:59
// @return: time.Duration，error
// @description: 东八时区
// @date: 2024/6/11 22:32
func DateTimeStrAadNowSub(ts string) (time.Duration, error) {
	// 本地时间
	now := time.Now()

	// 按照指定格式解析一个字符串格式的时间
	_, err := time.Parse("2006-01-02 15:04:05", ts)
	if err != nil {
		return 0, err
	}

	// 按照东八区的时区格式解析一个字符串
	tlocal, err := time.LoadLocation("Asia/Shanghai")
	if err != nil {
		return 0, err
	}

	// 按照指定的时区解析时间
	t, err := time.ParseInLocation("2006-01-02 15:04:05", ts, tlocal)
	if err != nil {
		return 0, err
	}

	// 计算时间的差值
	//reverseTime := now.Sub(t)
	reverseTime := t.Sub(now)

	return reverseTime, nil
}

// @title: 时间戳转日期
// @param: int64，*time.Location
// @return: string
// @description: 输出日期格式(2006-01-02)
// @date: 2024/6/11 22:32
func TimestampToDate(timestamp int64, loc *time.Location) string {
	tm := time.Unix(timestamp, 0).In(loc) // time.UTC
	return tm.Format("2006-01-02")
}

// @title: 时间戳转数字格式日期字符
// @param: int64，*time.Location
// @return: string
// @description: 输出日期格式(20060102)
// @date: 2024/6/11 22:32
func TimestampToDateNumber(timestamp int64, loc *time.Location) string {
	tm := time.Unix(timestamp, 0).In(time.UTC) // time.UTC
	return tm.Format("20060102")
}

// @title: 获取时区-东八区(中国上海)
// @param:
// @return: *time.Location
// @description:
// @date: 2024/6/11 22:32
func LocAsiaShanghai() *time.Location {
	loc, _ := time.LoadLocation("Asia/Shanghai")
	return loc
}

// @title: 获取时区-0时区
// @param:
// @return: *time.Location
// @description:
// @date: 2024/6/11 22:32
func LocUTC() *time.Location {
	return time.UTC
}

// @title: 获取时区-西八区(洛杉矶)
// @param:
// @return: *time.Location
// @description:
// @date: 2024/6/11 22:32
func LocAmericaLosAngeles() *time.Location {
	loc, _ := time.LoadLocation("America/Los_Angeles")
	return loc
}

// @title: 获取某个时间起，N天内的连续的数字格式日期
// @param: t:某个时间
// @param: days:相隔N天
// @param: dayN:取多少天
// @param: SameDay:当天是否在内
// @return: []time.Time
// @description: 返回格式如 [20240718 20240719 20240720 20240721 20240722 20240723 20240724]
// @date: 2024/6/11 22:32
func GetSometimeApartNDaysTimes(t time.Time, days int, dayN int, SameDay bool) []time.Time {
	list := make([]time.Time, 0, dayN)
	I := 0
	if SameDay {
		I = 1
		list = append(list, t)
	}
	for i := I; i < dayN; i++ {
		newTime := t.AddDate(0, 0, days)
		list = append(list, newTime)
		t = newTime
	}
	return list
}

// @title: 获取某个时间起，N天内的连续的时间（指定日期格式）
// @param: t:某个时间
// @param: days:相隔N天
// @param: dayN:取多少天
// @param: SameDay:当天是否在内
// @param: format:日期格式（如:2006-01-02 15:04:05）
// @return: []time.Time
// @description:
// @date: 2024/6/11 22:32
func GetSometimeApartNDaysTimesFormat(t time.Time, days int, dayN int, SameDay bool, format string) []string {
	list := GetSometimeApartNDaysTimes(t, days, dayN, SameDay)
	newList := make([]string, 0, len(list))
	for _, t := range list {
		date := t.Format(format)
		newList = append(newList, date)
	}

	return newList
}

// @title: 获取某个时间起，第N天内的时间（指定日期格式）
// @param: t:某个时间
// @param: days:相隔N天
// @param: format:日期格式（如:2006-01-02 15:04:05）
// @return: string
// @description: 可以用来获取明天、昨天日期
// @date: 2024/6/11 22:32
func GetSometimeApartNDaysTimeFormat(t time.Time, days int, format string) string {
	newT := t.AddDate(0, 0, days)
	str := newT.Format(format)
	return str
}
